/**  
 * All rights Reserved, Designed By <a href="www.itttq.com" target="_blank">www.itttq.com</a>
 * @date:   2017-07-21 11:42:21
 * @Copyright: 2017 <a href="www.itttq.com" target="_blank">www.itttq.com</a> Inc. All rights reserved. 
 */
package com.itttq.gshop.pbpm.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.itttq.gshop.domain.po.UserCartPo;
import com.itttq.gshop.domain.po.WareInfoPo;
import com.itttq.gshop.domain.to.ResultPageTo;
import com.itttq.gshop.domain.to.ResultTo;
import com.itttq.gshop.pbpm.mapper.IUserCartMapper;
import com.itttq.gshop.pbpm.mapper.IWareInfoMapper;

@Service
public class UserCartService {
	@Autowired
	private IUserCartMapper userCartMapper;
	@Autowired
	private IWareInfoMapper wareInfoMapper;
	
	/**
	 * 根据ID获取UserCartPo对象
	 * 
	 * @param id
	 * @return
	 * @Author 迷蝶
	 * @return UserCartPo
	 */
	public UserCartPo getUserCart(int id) {
		return userCartMapper.findUserCartById(id);
	}
	
	/**
	 * 根据条件获取UserCartPo对象，并返回查询的数据总数
	 * 
	 * @param userCart
	 * @Author 迷蝶
	 * @return ResultPageTo<UserCartPo>
	 */
	public ResultPageTo<UserCartPo> getUserCarts(UserCartPo userCart) {
		return new ResultPageTo<UserCartPo>(userCart.getStart(), userCart.getSize(), 
				userCartMapper.findUserCartCount(userCart), userCartMapper.findUserCarts(userCart));
	}
	
	/**
	 * 根据ID删除UserCartPo对象
	 * 
	 * @param id
	 * @Author 迷蝶
	 */
	public Integer delUserCart(int id) {
		return userCartMapper.delUserCartById(id);
	}
	
	/**
	 * 增加UserCartPo对象
	 * 
	 * @param userCart
	 * @Author 迷蝶
	 */
	public Integer addUserCart(UserCartPo userCart) {
		return userCartMapper.addUserCart(userCart);
	}
	
	/**
	 * 根据条件更新UserCartPo对象
	 * 
	 * @param userCart
	 * @Author 迷蝶
	 */
	public Integer updateUserCart(UserCartPo userCart) {
		return userCartMapper.updateUserCart(userCart);
	}
	
	/**
	 * 根据用户ID查找此用户购物车所有商品总数
	 * 
	 * @param userId
	 * @Author 迷蝶
	 * @return Integer
	 */
	public Integer getWareSumByUserId(Integer userId) {
		return userCartMapper.findWareSumByUserId(userId);
	}

	/**
	 * 设置购物车商品数量，前提是购物车商品已经存在
	 * 
	 * @param userId		用户ID
	 * @param cartId	商品ID
	 * @param number	商品数量。设置之后的数量
	 * @Author 迷蝶
	 * @return ResultTo
	 */
	public ResultTo setNumber(int userId, int cartId, int number) {
		ResultTo rt = new ResultTo();
		UserCartPo cart = new UserCartPo();
		cart.setId(cartId);
		cart.setUserId(userId);
		cart.setNumber(number);
		int rs = userCartMapper.updateUserCart(cart);
		if(rs != 1) {
			rt.setCode(ResultTo.FAIL);
		}
		return rt;
	}

	/**
	 * 添加商品到购物车，存在则数量加，不存在则创建
	 * 
	 * @param userId		用户ID
	 * @param username	用户名
	 * @param wareId	商品ID
	 * @param number	商品数量，要追加的数量
	 * @Author 迷蝶
	 * @return ResultTo
	 */
	public ResultTo addNumber(int userId, String username, int wareId, int number) {
		ResultTo rt = new ResultTo();
		UserCartPo cart = new UserCartPo();
		cart.setWareId(wareId);
		cart.setUserId(userId);
		List<UserCartPo> carts = userCartMapper.findUserCarts(cart);
		if(null == carts || carts.isEmpty()) { // 不存在则获取商品数据并设置数量等信息
			// 根据商品id获取商品数据
			WareInfoPo ware = wareInfoMapper.findWareInfoById(wareId);
			cart.setWareName(ware.getName());
			cart.setMainImage(ware.getImageMain());
			cart.setPriceOriginal(ware.getPriceOriginal());
			cart.setPricePromotional(ware.getPricePromotional());
			cart.setNumber(number);
			cart.setScore(ware.getScoreBuy());
			// TODO GXG 暂定为获取会员积分的一半，后续这个值设置处理。
			cart.setScorePromote(ware.getScoreBuy() / 2);
			cart.setUserName(username);
			if(userCartMapper.addUserCart(cart) != 1) {
				rt.setCode(ResultTo.FAIL);
			}
		} else { // 存在则只添加数量
			// 正常只有一个商品数量，所以取0
			cart = carts.get(0);
			rt = setNumber(userId, cart.getId(), cart.getNumber() + number);
		}
		if(rt.getCode() == ResultTo.SUCCESS) {
			// 返回购物车ID，供立即购买时使用。
			// TODO GXG 此处有个问题，就是之前购物车有同样商品，在点击立即付款之后会合计付款。这个需要根据实际情况自行决定是否这样处理
			rt.setMsg(String.valueOf(cart.getId()));
		}
		return rt;
	}
	
	/**
	 * 根据用户ID和购物车ID查找数据
	 * 
	 * @param userId	用户ID
	 * @param ids		购物车ID数组
	 * @Author 迷蝶
	 * @return List<UserCartPo>
	 */
	public List<UserCartPo> getCartsByUserIdAndIds(Integer userId, Integer[] ids) {
		return userCartMapper.findCartsByUserIdAndIds(userId, ids);
	}
}
